package com.hanzidong.util;

public class StringUtil {
	
	private static final String EMAIL_REGEX="^([a-z0-9A-Z]+[-|_|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
	private static final String PHONE_REGEX="^1[3|4|5|7|8|9]\\d{9}$";
	private static final String LETTER_REGEX="[a-zA-Z]+";

	/**
	* 功能：检查包含空白字符在内的字符串长度
	* 示例：
	* StringUtil.hasLength(null) -> false
	* StringUtil.hasLength("") -> false
	* StringUtil.hasLength(" ") -> true
	* StringUtil.hasLength("Hello") -> true
	*/
	public static boolean hasLength(String src){
		
		//如果为空，则返回false
		if(src == null || src.equals("")) {
			return false;
		}
		return true;
	}
	
	/**
	* 功能：检查包含空白字符在内的字符系列长度，并处理过滤前后空格
	* 示例：
	* StringUtil.hasText(null) -> false
	* StringUtil.hasText("") -> false
	* StringUtil.hasText(" ") -> false
	* StringUtil.hasText("Hello") -> true
	*/
	public static boolean hasText(String src){
		//如果为空，则返回false  trim()去掉字符串的前后空格或者tab键
		if(src == null || src.trim().equals("")) {
			return false;
		}
		return true;
	}
	
	/**
	* 功能：验证是否为合格邮箱
	* 示例：
	* StringUtil.isEmail(null) -> false
	* StringUtil.isEmail("") -> false
	* StringUtil.isEmail("zhangjihao@") -> false
	* StringUtil.isEmail("zhangjihao@sohu") -> false
	* StringUtil.isEmail("zhangjihao@sohu.com") -> true
	*/
	public static boolean isEmail(String email){
		
		//如果不为空，则判断正则
		if(hasText(email)) {
			//将判断结果返回
			return email.matches(EMAIL_REGEX);
		}
		
		return false;
	}
	
	/**
	* 功能：验证是否为合格手机号
	* 示例：
	* StringUtil.isPhone(null) -> false
	* StringUtil.isPhone("") -> false
	* StringUtil.isPhone("14312039428") -> false
	* StringUtil.isPhone("13900139000") -> true
	*/
	public static boolean isPhone(String src){
		//如果不为空，则判断正则
		if(hasText(src)) {
			//将判断结果返回
			return src.matches(PHONE_REGEX);
		}
		
		return false;
	}
	
	/**
	* 功能：判断是否全部为字母
	* 示例：
	* StringUtil.isLetter(null) -> false
	* StringUtil.isLetter("") -> false
	* StringUtil.isLetter(".com") -> false
	* StringUtil.isLetter("howSun") -> true
	*/
	public static boolean isLetter(String src){
		//如果不为空，则判断正则
		if(hasText(src)) {
			//将判断结果返回
			return src.matches(LETTER_REGEX);
		}
		
		return false;
	}
	
	/**
	* 功能：反转字符串
	* 示例："abcd" → "dcba"
	*
	* 参数1：src，源字符串
	* 返回值：反转的字符串
	*/
	public static String reverse(String src){
		if(src != null) {
			//创建一个Stringbuffer类
			StringBuffer sb = new StringBuffer(src);
			
			//反转字符串
			return sb.reverse().toString();
		}
		
		return src;
	}
	
	/**
	* 功能：隐藏字符串
	* 示例：StringUtil.hidden("13856237928", 3,7) -> "138****7928"
	* 22222	1,3	*
	* 参数1：src，源字符串
	* 参数2：start，从开始的位置隐藏，如果为空，则全部不隐藏，
	* 参数3：end，结束位置，如果为空或为-1，则直到末尾都隐藏，如果超过源字符串长度，则只到末尾
	* 返回值：隐藏结果
	* 
	* 使用替换方式会出现bug，如果原字符串都是同一个字符，则替换出问题
	* System.out.println(StringUtil.hidden("222222222", 3, 7));  -> ********2
	*
	*/
	public static String hidden(String src, Integer start, Integer end){
		
		//如果开始为空，或者字符串为空，则直接返回
		if(start == null || src == null || start >= end ) {
			return src;
		}
		
		//处理结束下标，如果为空，或者-1，或者超过长度，则将其值设置为字符串的长度
		if(end == null || end == -1 || end >= src.length()) {
			end = src.length() - 1;
		}
		
		/*  使用替换方式隐藏字符串
		//根据开始和结束下标截取字符串
		String substring = src.substring(start, end);
		
		String restr = "";
		//创建星号*
		for(int i = start ;i<end ;i++) {
			restr+="*";
		}
		
		//将截取后的字符串进行替换
		String replace = src.replace(substring, restr);
		
		return replace; */
		
		//使用拼接方式替换字符串
		//获取开始下标之前的数据
		String str_start = src.substring(0, start);
		
		//获取结束下标之后的数据
		String str_end = src.substring(end);
		
		//需要隐藏的内容
		String restr = "";
		//创建星号*
		for(int i = start ;i<end ;i++) {
			restr+="*";
		}
		
		//拼装数据
		return str_start + restr + str_end;
	}
	
	
	/*
	* 方法功能：根据正则在字符串提取一段值，用于后面在url地址里提取ID值。
	* 例如在“http://news.cnstock.com/news,yw-201908-4413224.htm”把“4413224”提取出来。
	*/
	public static String getPlaceholderValue(String src, String regex){
		
		//最后一个横杠的下标
		int start = src.lastIndexOf("-");
		//最后一个点的下标
		int end = src.lastIndexOf(".");
		
		return src.substring(start + 1, end);
	}
}
